{{template "header" .}}

<div class="ibox float-e-margins" >
    <div class="row">
        <div class="col-lg-8"></div>
        <div class="col-lg-4"></div>

    </div>

    <div class="row">

        <div class="col-sm-12">
            <div class="ibox float-e-margins">
                <div class="ibox-title">
                    <h5>通用</h5>
                    <div class="ibox-tools">
                        <a class="collapse-link">
                            <i class="fa fa-chevron-up"></i>
                        </a>
                        <a class="close-link">
                            <i class="fa fa-times"></i>
                        </a>
                    </div>
                </div>
                <div class="ibox-content">

                    <h3><strong>在线文档</strong></h3>

                    <p>&nbsp;</p>

                    <p><a href="http://wiki.xbifrost.com" target="_blank"><h4>wiki.xbifrost.com</h4></a></p>

                    <p>&nbsp;</p>

                    <h2><strong>数据源</strong></h2>
                    <p>&nbsp;</p>
                    <h3>需要权限</h3>
                    <p>GRANT SELECT, SHOW DATABASES, SUPER, REPLICATION SLAVE, EVENT ON *.* TO 'xxtest'@'%'</p>
                    <p>RDS云产品数据库云产品权限,可能不是按 MySQL 开源权限来的,请自行确认是否有足够权限</p>
                    <p>会执行的SQL：</p>
                    <p>SELECT `COLUMN_NAME`,`COLUMN_DEFAULT`,`IS_NULLABLE`,`COLUMN_TYPE`,`COLUMN_KEY`,`EXTRA`,`COLUMN_COMMENT`,`DATA_TYPE`,`NUMERIC_PRECISION`,`NUMERIC_SCALE` FROM `information_schema`.`columns` WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?</p>
                    <p>SELECT COLUMN_NAME,COLUMN_KEY,COLUMN_TYPE,CHARACTER_SET_NAME,COLLATION_NAME,NUMERIC_SCALE,EXTRA,COLUMN_DEFAULT,DATA_TYPE,CHARACTER_OCTET_LENGTH FROM information_schema.columns WHERE table_schema= ? AND table_name= ? ORDER BY `ORDINAL_POSITION` ASC</p>
                    <p>SELECT `SCHEMA_NAME` FROM `information_schema`.`SCHEMATA`</p>
                    <p>SELECT TABLE_NAME,TABLE_TYPE FROM `information_schema`.`TABLES` WHERE TABLE_SCHEMA = ?</p>
                    <p>SHOW GLOBAL VARIABLES LIKE 'BINLOG_CHECKSUM'</p>
                    <p>SHOW MASTER STATUS</p>
                    <p>SHOW VARIABLES LIKE 'server_id'</p>
                    <p>SHOW VARIABLES LIKE 'binlog_format'</p>
                    <p>SELECT connection_id()</p>
                    <p>SELECT TIME,STATE FROM `information_schema`.`PROCESSLIST` WHERE ID = ?'</p>
                    <p>KILL 当前帐号binlog监控的异常连接</p>
                    <p>&nbsp;</p>
                    <p>根据以上SQL,如果是RDS等云产品,请自行确认是否有 <strong>监听Binlog的权限</strong>，<strong>KILL 当前帐号连接的权限</strong>,<strong>SET 权限</strong></p>
                    <p>在 binlog 解析过程中,会对需要同步的表进行结构查询, 所以请事先给帐号设置好对需要同步的表的查询权限，并且添加数据源 CheckPrivilege 的时候是检测不出来的，需要用户自行关注</p>

                    <p>&nbsp;</p>
                    <h3>状态</h3>
                    <p>close : 表示数据源没有启动,只有 close 状态的时候才能 <strong>人工修改位点</strong> 或者 <strong>删除数据源</strong></p>
                    <p>starting : 请求正在尝试连接或者重连 MySQL</p>

                    <p>running : 表示正在运行</p>
                    <p>stop : 暂停状态,临时性的,这个状态只是让后台在sleep,建议这个状态不要长时间保留</p>
                    <p>closing : 正在尝试关闭数据源,断掉和 MySQL 的连接</p>
                    <p>&nbsp;</p>

                    <h3>数据源常见问题</h3>

                    <p><strong>1. 一直是 starting 状态,有以下可能</strong></p>
                    <p>1). 刷新整个界面,看是否会有状态变化</p>
                    <p>2). 在尝试启动数据源之前,发现位点有问题,会自动的将当前位点文件最开始的位置进行遍历寻找离当前最近的一个可用的位点,如果这个关闭请 点击close 或者 去MySQL kill 连接</p>
                    <p>3). 网络异常,一直在重试</p>
                    <p></p>


                    <p><strong>2. 卡在 closing 状态</strong></p>
                    <p>1). 刷新整个界面,看是否会有状态变化</p>
                    <p>2). 假如上一个状态是 staring 再点击关闭的,那可能是因为位点不对,后台在寻找正确的位点,比较慢,如果这个时候需要关闭,请 <strong>去MySQL 端找到相关连接 进行 Kill 操作</strong></p>
                    <p>3). 判断 MySQL 连接是否假死等情况,如果要退出,请去MySQL Kill 连接</p>

                    <p>&nbsp;</p>

                    <a name="FuzzyMatching"></a>
                    <h3>位点延时</h3>

                    <p>在点击 <strong>最新位点</strong> 按钮的时候 并且数据源是running状态 </p>
                    <p>假如会计算当前位点 和 最新位点 不一致的情况下,将会拿最后解析成功的位点时间 与 当前时间点进行对比,算出差值,单位(秒)</p>
                    <p>这里并不是拿最新位点的时间对比,而是当前服务器时间</p>
                    <p>&nbsp;</p>


                    <h2><strong>模糊匹配表配置</strong></h2>
                    <p>在点击添加表和通道绑定的界面，可以选择 FuzzyMatching 为 Yes, 可以进表名进行编辑</p>
                    <p>模块匹配的表名，必须带有 * </p>
                    <p><strong>案例</strong></p>
                    <p>假如 bifrost_test 库有以下的表 </p>
                    <p>bak_binlog_field_test_mytest</p>
                    <p>binlog_field_test</p>
                    <p>binlog_field_test_1</p>
                    <p>binlog_field_test_2</p>
                    <p>binlog_field_test_3</p>
                    <p>table_nodata</p>
                    <p>table_nodata_2</p>
                    <p>&nbsp;</p>

                    <p>规则1：</p>
                    <p>binlog_field_test_*</p>
                    <p>匹配表：binlog_field_test_1 , binlog_field_test_2 , binlog_field_test_3 </p>
                    <p>不会匹配: bak_binlog_field_test_mytest 和 binlog_field_test</p>
                    <p>&nbsp;</p>
                    <p>规则1：</p>
                    <p>*_nodata</p>
                    <p>匹配表：table_nodata </p>
                    <p>不会匹配: table_nodata_2</p>
                    <p>&nbsp;</p>

                    <p>IgnoreTables</p>
                    <p>在模糊匹配表规则中，允许指定过滤部分表不进行匹配，错误过同步</p>
                    <p>多个用 逗号 隔开,例如： table1,table2,table3</p>
                    <p>只对增量有效,全量任务无效,全量任务,可以自行修改不查询哪些表</p>
                    <p>&nbsp;</p>
                    <p>&nbsp;</p>

                    <h2><strong>全量任务</strong></h2>
                    <p>全量任务假如在选择了 分页方式 为 BETWEEN 的情况下，并且 数据库 主键为自增类型的时候，将会按 BETWEEN X AND Y 的方式进行查询</p>
                    <p>当前 全量任务 和 增量 在1.2.1版本开始 已经相互独立，不再共用线程同步，全量同步的时候，请先数据源开关，以免造成数据出错</p>
                    <p>在没有 where 条件下，假如 自增id 最大值和最小值，分页次数 是 Limit 分页的2倍以上，并且总数小于 100万 的情况下，会自动转成 Limit 方式分页</p>
                    <p>&nbsp;</p>
                    <p>&nbsp;</p>

                    <h2><strong>DDL 支持说明</strong></h2>

                    <p>当前只支持字段在表结构末尾追加新字段，如果配置的二进制位点是在DDL 之前的位点，会出现数据和字段对应不上</p>
                    <p>数据类型修改之后，如果配置的二进制位点是在DDL 之前的位点，可能会出现数据出错</p>
                    <p>&nbsp;</p>
                    <h2><strong>存储类型数据转换</strong></h2>
                    <p>从Binlog解析出来的数据,在转成 map[string]interface{} 的数据格式的时候</p>
                    <p>MySQL里的存储类型对应Golang里的数据类型不一样</p>
                    <p>括号里的代表是Golang里的数据类型</p>
                    <p>TINYINT ( int8 | unit8 ) , SMALLINT ( int16 | unit16 ) , MEDIUMINT ( int32 | uint32 ), INT ( int32 | uint32 ) , BIGINT ( int64 | uint64 )<p>
                    <p>FLOAT ( float32 ) , DOUBLE ( float64 ) ,REAL ( float64 )</p>
                    <p>DECIMAL , NUMERIC( 返回string类型 )</p>
                    <p>DATE , TIME , YEAR , DATETIME , TIMESTAMP   ( string类型 )</p>
                    <p>CHAR , VARCHAR ( string ) </p>
                    <p>TEXT , TINYTEXT , MEDIUMINTTEXT , LONGTEXT ( string )</p>
                    <p>BLOB, TINYBLOB , MEDIUMINTBLOB , LONGBLOB ( string )</p>
                    <p>ENUM ( string类型 )</p>
                    <p>SET ( []string )</p>
                    <p>BIT ( int64类型 )</p>
                    <p>&nbsp;</p>
                    <h2><strong>标签</strong></h2>
                    <p><strong>{$SchemaName} : </strong>  数据库名字</p>
                    <p><strong>{$TableName} : </strong>  表的名字</p>
                    <p><strong>{$EventType} : </strong>  当前记录的增删改事件,新增(insert); 修改(update) ; 删除(delete); SQL(sql)</p>
                    <p><strong>{$Timestamp} : </strong>  当前Bifrost同机器的时间戳</p>
                    <p><strong>{$BinlogTimestamp} : </strong>  Binlog 发生的时间戳</p>
                    <p><strong>{$BinlogFileNum} : </strong> Binlog文件编号,并不是 整个Binlog文件名,比如 binlog 文件是 mysql-bin.000001 那这个 BinlogFileNum 的值 是1</p>
                    <p><strong>{$BinlogPosition} : </strong> Binlog position 位点</p>
                    <p><strong>{$字段名} : </strong>  表的字段数据</p>
                    <p><strong>{$字段名['key1'][0]['key3']} : </strong> </p>
                    <p>假如 JSON 字段内容值为 ：{"testK": [{"Bool": false, "Null": null, "Time": "2020-05-31 23:21:30", "Int32": -2147483648, "Int64": -9223372036854775808, "String": "ss", "Uint32": 4294967295, "Uint64": 18446744073709551615, "Float64": 526637.46}]} </p>
                    <p>{$字段名['testK'][0]['Time']} 的对应的值 为：2020-05-31 23:21:30 </p>
                    <p>&nbsp;</p>
                    <p>备注： 标签支持程度，取决于各个插件的实现,请参考各插件的文档</p>
                    <p>&nbsp;</p>
                    <h2><strong>其他配置</strong></h2>
                    <p>&nbsp;</p>
                    <h3><strong>MustBeSuccess</strong></h3>
                    <p><strong>True : </strong> 当提交到 toServer 返回true 的时候,会进行重试操作,直到成功或者手工设置Miss 错过操作</p>
                    <p><strong>False : </strong> 不管提交到 toServer 返回true 或者 false,都不进行重试提交</p>

                    <p>&nbsp;</p>
                    <h3><strong>FilterQuery</strong></h3>
                    <p><strong>True : </strong> 将过滤sql 事件，不提供给插件层处理</p>
                    <p><strong>False : </strong> 由插件层自行决定怎么处理</p>

                    <p>&nbsp;</p>
                    <h3><strong>FilterUpdate</strong></h3>
                    <p><strong>True : </strong> update事件，所选字段内容都没有变更情况下，不进行推送</p>
                    <p><strong>False : </strong> 不管字段有没有更新，全部都会推送</p>

                    <p>&nbsp;</p>

                    <h3><strong>Fields</strong></h3>
                    <p>默认为全选, 选中的字段才会进行解析推送</p>

                    <p>&nbsp;</p>

                    <h3><strong>位点修改</strong></h3>
                    <p>只有数据源是 close 状态，位点修改按钮才会显示出来</p>
                    <p>修改位点的时候，数据源必须是可连接的</p>
                    <p>修改位点的时候走，并不会验证位点正确性，会在 启动 数据源的时进行验证，假如位点有异常，启动 数据源的时候，会找到一个最近的正确位点进行开始</p>
                    <p>同时更新ToServer 选项 （ 默认为False ）</p>
                    <p>True: 将会所有设置的表同步保存的位点强制更新,这个操作不可逆. 假如是更换边接的机器，或者位点有问题的情况下，建议选择为 True，因为表同步的时候，会判断当前数据的位点，是不是小于当前表保存的位点，小于则错过这条数据</p>
                    <p>False: 只修改数据当前的连接位点，假如只是修改了，没有点击 开启 数据源，保存开启的过程有问题。又再一次重启 Bifrost 这个位点修改无效</p>
                    <p>&nbsp;</p>

                </div>
            </div>
        </div>

    </div>


    <a name="pluginDocName">&nbsp;</a>
    <div class="row">
        <div class="col-sm-12">
            <div class="ibox float-e-margins">
                <div class="ibox-title">
                    <h5>Plugin 配置</h5>
                   
                    <div style="float: right; margin-top: -10px">
                        <select class="form-control" name="type" id="PluginList">
                        {{range $k, $val := .Drivers}}
                            <option value="{{$k}}" version="{{$val.Version}}" > {{$k}} - {{$val.Version}}</option>
                        {{end}}
                        </select><span class="help-block m-b-none"></span>
                    </div>
                    <div class="ibox-tools">
                        <a class="collapse-link">
                            <i class="fa fa-chevron-up"></i>
                        </a>
                        <a class="close-link">
                            <i class="fa fa-times"></i>
                        </a>
                    </div>
                </div>
                
                <div class="ibox-content col-sm-12" >
                	
                     <div class="col-sm-7">
                     	<div class="col-sm-12 ibox-content" id="PluginDocDiv" style="border:0px"></div>
                     </div>
                     
                     
                     <div class="col-sm-5" >
                     	<div class="col-sm-12 ibox-content" id="PluginWebDiv" style="border-top:0px;"></div>
                     </div>
                </div>
            </div>
        </div>

	

    </div>

</div>

{{template "footer" .}}

<script type="text/javascript">
    function GetPluginDoc(){
        var key = $("#PluginList").val();
        var pluginVersion = $("#PluginList").find("option:selected").attr("version");
        $("#PluginDocDiv").load("/plugin/"+key+"/www/doc.html?v="+pluginVersion,function( response, status, xhr ){
            if ( status == "error" ) {
                $("#PluginDocDiv").html(key+ " no docs");
            }
        });
		$("#PluginWebDiv").load("/plugin/"+key+"/www/"+key+".html?v="+pluginVersion);
		$.getScript("/plugin/"+key+"/www/"+key+".js?v="+pluginVersion,function(){});
    }
    $("#PluginList").change(
        function(){
            GetPluginDoc();
        }
    );
    var pluginKey="{{.PluginKey}}"
    if(pluginKey == ""){
        GetPluginDoc();
    }else{
        $("#PluginList").val(pluginKey);
        GetPluginDoc();
        location.href = "#pluginDocName";
    }


</script>
